/*
 * ConsoleModeBase.hpp
 *
 *  Created on: 16/12/2011
 *      Author: Tales
 */

#ifndef _VIEW_CONSOLEMODEBASE_HPP_
#define _VIEW_CONSOLEMODEBASE_HPP_

#include "Mode.hpp"
#include <utility>
#include <string>
#include <vector>

namespace yep
{
using namespace std;

/**
 * @brief Classe base para modos baseados em console.
 */
class ConsoleModeBase: public yep::Mode
{
public:

	ConsoleModeBase();
	/**
	 * @brief Destrutor
	 */
	virtual ~ConsoleModeBase();

	/**
	 * @brief As funções possíveis de uma linha no console.
	 */
	enum Function
	{
		NO_FUNCTION, //!< TEXT Uma linha de texto simples. Chama automaticamente a próxima
		END, //!< END ends
		PAUSE,//!< PAUSE pausa até alguma tecla ser precionada
		INPUT_INT, //!< INPUT_INT Uma linha que só permite ir para a próxima após digitar um inteiro
		INPUT_YESNO, //!< INPUT_YESNO Uma linha que só permite ir para a próxima após responder S ou N.
		INPUT_CHAR
	//!< INPUT_CHAR Uma linha que só permite ir para a próxima após digitar um char.
	};

	/**
	 * @brief Returna a próxima linha e sua função
	 * @return A próxima linha e sua função no console.
	 */
	virtual pair<string, Function> getNextLine(Editor & editor) = 0;

	/**
	 * @brief Volta para a primeira linha.
	 */
	virtual void setup();

	/**
	 * Quando a função da linha anterior for diferente de TEXT, a resposta é enviada para este método.
	 * @param answer a resposta digitada pelo usuário.
	 */
	virtual void handleAnswer(Editor & editor, string answer) = 0;

	virtual void handle(Editor &editor, const SDL_Event &event);

	virtual void logic(Editor &editor);

	virtual void draw(Editor &editor, SDL_Surface *surface);
private:
	vector<string> lines;
	Function function;
	string answer;
};

} /* namespace yep */
#endif /* _VIEW_CONSOLEMODEBASE_HPP_ */
